package com.algorithm.ch1.lzr.string;

/**
 * 报数序列是指一个整数序列, 按照其中的整数的顺序进行报数, 得到下一个数
 * 1.     1                 1
 * 2.     11                10
 * 3.     21                11
 * 4.     1211              100
 * 5.     111221            101
 * 6.     312211            110
 * 7.     13112221          111
 * 8.     1113213211        1000
 * 9.     31131211131221
 * 10.    13211311123113112211
 * <p>
 * 1 被读作  "one 1"  ("一个一") , 即 11。
 * 11 被读作 "two 1s" ("两个一"）, 即 21。
 * 21 被读作 "one 2",  "one 1" （"一个二" ,  "一个一") , 即 1211。
 * <p>
 * 给定一个正整数 n ，输出报数序列的第 n 项。
 * <p>
 * 注意：整数顺序将表示为一个字符串。
 *
 * @author lzr
 * @date 2018/8/15
 */
public class CountAndSay {

    public static void main(String[] args) {
        String s = countAndSay(1);
        System.out.println(s);
    }

    /**
     * 返回结果
     *
     * @param n
     * @return
     */
    public static String countAndSay(int n) {
        if (n < 1) {
            return null;
        }
        String result = "1";
        for (int i = 1; i < n; i++) {
            result = count(result);
        }
        return result;
    }

    /**
     * 报数
     *
     * @param result
     * @return
     */
    private static String count(String result) {
        StringBuffer sb = new StringBuffer();
        for (int i = 0; i < result.length(); i++) {
            int ch = result.charAt(i) - '0';
            int count = 1;
            while (i + 1 < result.length() && result.charAt(i) == result.charAt(i + 1)) {
                count++;
                i++;
            }
            sb.append(count).append(ch);
        }
        return sb.toString();
    }

}
